Rearrange restart logic so that a failure to restart a domain does not cause
authoremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>
Tue, 8 Nov 2005 02:07:57 +0000 (03:07 +0100)
committeremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>
Tue, 8 Nov 2005 02:07:57 +0000 (03:07 +0100)
cascading secondary errors.  Fixes bug #384.

Signed-off-by: Ewan Mellor <ewan@xensource.com>
tools/python/xen/xend/XendDomainInfo.py

index 6735ccc0f2513983b85e50e5add44e90abad89a8..e03e5a63c583a3917f4e9d254b0e53aac31815dc 100644 (file)
@@ -90,6 +90,8 @@ ZOMBIE_PREFIX = 'Zombie-'
 """Minimum time between domain restarts in seconds."""
 MINIMUM_RESTART_TIME = 20
 
+RESTART_IN_PROGRESS = 'xend/restart_in_progress'
+
 
 xc = xen.lowlevel.xc.new()
 xroot = XendRoot.instance()
@@ -1269,14 +1271,14 @@ class XendDomainInfo:
 
         config = self.sxpr()
 
-        if self.readVm('xend/restart_in_progress'):
+        if self.readVm(RESTART_IN_PROGRESS):
             log.error('Xend failed during restart of domain %d.  '
                       'Refusing to restart to avoid loops.',
                       self.domid)
             self.destroy()
             return
 
-        self.writeVm('xend/restart_in_progress', 'True')
+        self.writeVm(RESTART_IN_PROGRESS, 'True')
 
         now = time.time()
         rst = self.readVm('xend/previous_restart_time')
@@ -1298,26 +1300,28 @@ class XendDomainInfo:
                 self.preserveForRestart()
             else:
                 self.destroyDomain()
-                
+
+            # new_dom's VM will be the same as this domain's VM, except where
+            # the rename flag has instructed us to call preserveForRestart.
+            # In that case, it is important that we remove the
+            # RESTART_IN_PROGRESS node from the new domain, not the old one,
+            # once the new one is available.
+
+            new_dom = None
             try:
                 xd = get_component('xen.xend.XendDomain')
                 new_dom = xd.domain_create(config)
-                try:
-                    new_dom.unpause()
-                except:
-                    new_dom.destroy()
-                    raise
+                new_dom.unpause()
+                new_dom.removeVm(RESTART_IN_PROGRESS)
             except:
-                log.exception('Failed to restart domain %d.', self.domid)
-        finally:
-            # new_dom's VM will be the same as this domain's VM, except where
-            # the rename flag has instructed us to call preserveForRestart.
-            # In that case, it is important that we use new_dom.removeVm, not
-            # self.removeVm.
-            new_dom.removeVm('xend/restart_in_progress')
-            
-        # self.configure_bootloader()
-        #        self.exportToDB()
+                if new_dom:
+                    new_dom.removeVm(RESTART_IN_PROGRESS)
+                    new_dom.destroy()
+                else:
+                    self.removeVm(RESTART_IN_PROGRESS)
+                raise
+        except:
+            log.exception('Failed to restart domain %d.', self.domid)
 
 
     def preserveForRestart(self):